#pragma once
#include <iostream>
#include <semaphore.h>
#include <pthread.h>

namespace SemModule
{
    const int defaultvalue = 1;
    class Sem
    {
    public:
        Sem(unsigned int sem_value = defaultvalue) 
        {
            sem_init(&_sem,0,sem_value);
        }
        void P()
        {
            //核心功能是原子性地减少信号量的值，并根据信号量的状态决定是否阻塞当前线程/进程。
            int n = sem_wait(&_sem);//-1原子的
            (void)n;
        }
        void V()
        {
            //功能是原子性地增加信号量的值，并可能唤醒因等待该信号量而阻塞的线程/进程。
            int n = sem_post(&_sem);//+1原子的
            (void)n;
        }
        ~Sem() 
        {
            sem_destroy(&_sem);
        }

    private:
        sem_t _sem;
    };
}